#include "BoardCommunicationModule.h"
#include "SimpleCompletion.h"

#include "BufDef.h"

#include <string.h>

// 无Timer0的串口接收
rt_sem_t usart_transport_check_sem;

// I2C RTC写数据地址。读地址直接+1即可
#define RTC_ADDR_W 0x64
#define RTC_ADDR_R 0x65

// 外部RTC状态
static uint8_t outside_rtc_status = 0x00;

//bool i2c4_busy = false;
bool i2c4_base_init = false;
/* i2c4消息队列控制块 */
struct rt_messagequeue i2c4_mq;
// i2c4事件集
rt_event_t i2c_transport_event;
// i2c没法全双工，因此这里只有一个信号
rt_sem_t i2c4_transport_sem;

void Sys_Task_I2c4_RTC_TMP_Main(void) {
  if (!i2c4_base_init) {// 初始化任务所需的内容 仅限不需要循环初始化的
    //i2c4任务队列
    // i2c任务太短了，暂时不要邮箱了。
    //    rt_mq_init(&i2c4_mq,
    //               "i2c4_mq",
    //               &i2c_4_tx_msq_pool, /* 内存池指向 msg_pool */
    //               64,                 /* 每个消息的大小是 1 字节 */
    //               256,                /* 内存池的大小是 msg_pool 的大小 */
    //               RT_IPC_FLAG_PRIO);  /* 如果有多个线程等待，优先级大小的方法分配消息 */
    SWDT_FeedDog();
    //i2c4接收锁
    i2c4_transport_sem = rt_sem_create("i2c4_transport_sem", 0, RT_IPC_FLAG_PRIO);

    i2c4_base_init = true;
  }// 初始化任务所需的内容 仅限不需要循环初始化的

  {// 每次启动任务都要执行的初始化工作
  }// 每次启动任务都要执行的初始化工作

  // I2c4主任务循环
  for (;;) {
    {// RTC主任务
      // 读取芯片工作状态。
      if (STATU_GET_NOT(outside_rtc_status, RTC_INITED)) {
        rt_kprintf("start inited outside rtc\n");
        Reset_I2c_Data_Task_Obj(&i2c_4_rx_app_buf);
        // 一上来就延迟50ms是因为rtc芯片上电大概需要50ms（来自于官方手册）
        rt_thread_mdelay(50);

        // 检测外部RTC的I2C通道是否在忙，按道理来说都不忙。因为没有别的任务涉及到这里
        if (I2C_PORT_IDLE == i2c_4_rx_app_buf.port_status) {
          i2c_4_rx_app_buf.transport_mode = MD_Read;
          i2c_4_rx_app_buf.port_status = I2C_PORT_BUSY;
          i2c_4_rx_app_buf.data_buf[0] = RTC_ADDR_R;
          // 这个指令码用来读取RTC芯片硬件是否初始化完成
          i2c_4_rx_app_buf.data_buf[1] = 0x5A;
          i2c_4_rx_app_buf.send_data_len = 2;
          i2c_4_rx_app_buf.receive_data_len = 1;
          i2c_4_rx_app_buf.receive_translate_index = i2c_4_rx_app_buf.send_data_len;

          /* General start condition */
          Master_Start(CM_I2C4);

          // 等候传送完成

          SWDT_FeedDog();
          // 尝试让渡CPU执行
          rt_thread_yield();
        } else {
          rt_kprintf("i2c4 is busy!\n");
          SWDT_FeedDog();
          // 尝试让渡CPU执行
          rt_thread_yield();
        }
      }


    }// RTC主任务

    {// 温湿度传感器主任务
    }// 温湿度传感器主任务
  }
}

void Reset_I2c_Data_Task_Obj(I2c_Data_Task_Def *obj) {
  obj->port_status = I2C_PORT_IDLE;
  obj->send_data_len = 0;
  obj->send_translate_index = 0;
  obj->receive_data_len = 0;
  obj->receive_translate_index = 0;
  memset((obj->data_buf), 0, 50);
}

uint32_t u9_standy_by = 0;
void Check_Usart_Receive_Data_Task(void *parmameter) {
  for (;;){
    completion_wait(usart_transport_check_sem, RT_WAITING_FOREVER);
	{ 
		// 串口9接收处理
		if (u9_rx_size != 0 ){
			if (u9_standy_by != 0 && u9_standy_by == u9_rx_size) {
				// 接收完成
//				rt_kprintf("get data: %d\nget str: %s\n", u9_rx_size, usart_9_rx_msq_buf);
//				rt_thread_mdelay(1);
				usart_9_rx_msq_buf[3] = u9_rx_size % 0x100;
				usart_9_rx_msq_buf[2] = ( u9_rx_size >> 8 ) % 0x100;
				usart_9_rx_msq_buf[1] = ( u9_rx_size >> 16 ) % 0x100;
				usart_9_rx_msq_buf[0] = ( u9_rx_size >> 24 ) % 0x100;
				rt_mq_send_wait(&rs485_3_usart_rx_mq, (void*)usart_9_rx_msq_buf, 1024, 500);
				
				// 重置接收通道
				//completion_done(rs485_3_usart_rx_sem);
				memset((void*)usart_9_rx_msq_buf, 0, u9_rx_size + 4);
				u9_standy_by = 0;
				u9_rx_size = 0;
				//DMA_ReconfigCmd(CM_DMA2, DMA_CH1);
				AOS_SW_Trigger();
			}else{
				u9_standy_by = u9_rx_size;
			}
		} 
	  //GPIO_TogglePins(LED_RUN_PORT, LED_RUN_PIN);
	}
	// 尝试让渡CPU执行
	SWDT_FeedDog();
	rt_thread_yield();
  }
}
